﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 合成模式：合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。
///           合成模式就是一个处理对象的树结构的模式。
///           合成模式把部分与整体的关系用树结构表示出来。
///           合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。
/// </summary>
namespace DesignPattern_Composite
{
    // 含有合成模式的基类
    public abstract class IComponent
    {
        protected string m_Value;
        public abstract void Operation();   // 一般操作
                                            // 加入節點
        public virtual void Add(IComponent theComponent)
        {
            Debug.LogWarning("子類別沒實作");
        }
        // 移除节点
        public virtual void Remove(IComponent theComponent)
        {
            Debug.LogWarning("子類別沒實作");
        }
        // 取得子节点
        public virtual IComponent GetChild(int Index)
        {
            Debug.LogWarning("子類別沒實作");
            return null;
        }
    }

    // 单独节点
    public class Leaf : IComponent
    {
        public Leaf(string Value)
        {
            m_Value = Value;
        }
        public override void Operation()
        {
            Debug.Log("Leaf[" + m_Value + "]执行Operation()");
        }
    }

    // 含有合成结构的节点
    public class Composite : IComponent
    {
        List<IComponent> m_Childs = new List<IComponent>();

        public Composite(string Value)
        {
            m_Value = Value;
        }

        // 一般操作
        public override void Operation()
        {
            Debug.Log("Composite[" + m_Value + "]");
            foreach (IComponent theComponent in m_Childs)
                theComponent.Operation();
        }

        // 加入节点
        public override void Add(IComponent theComponent)
        {
            m_Childs.Add(theComponent);
        }

        // 移除节点
        public override void Remove(IComponent theComponent)
        {
            m_Childs.Remove(theComponent);
        }

        // 取得子节点
        public override IComponent GetChild(int Index)
        {
            return m_Childs[Index];
        }
    }

}
